`
https://leetcode.cn/problems/reschedule-meetings-for-maximum-free-time-i/
`

/**
 * @param {number} eventTime
 * @param {number} k
 * @param {number[]} startTime
 * @param {number[]} endTime
 * @return {number}
 */
var maxFreeTime = function (eventTime, k, startTime, endTime) {
  // 找到所有的空闲时段，至多安排 k 个会议等价于合并 k + 1 个空闲时段
  const n = startTime.length
  const free = new Array(n + 1).fill(0)
  free[0] = startTime[0] // 最左边的空闲时段
  for (let i = 1; i < n; i++) {
    free[i] = startTime[i] - endTime[i - 1] // 中间的空闲时段
  }
  free[n] = eventTime - endTime[n - 1] // 最右边的空闲时段

  let left = 0, right = 0
  let res = 0
  let sum = 0
  // 维护一个长度为 k + 1 的滑动窗口
  while (right < n + 1) {
    const n1 = free[right++]
    sum += n1

    if (right - left >= k + 1) {
      res = Math.max(res, sum)
      const n2 = free[left++]
      sum -= n2
    }
  }

  return res
};